/*
 * @Author: your name
 * @Date: 2023-09-30 20:15:35
 * @LastEditTime: 2023-11-15 17:11:40
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \Angle\User\ModuleAdaption\adaption_imu.h
 */
/** 此文件用于将上层与模块的关系适配起来，该头文件是上层对于
 * 中间层的实现需求，具体的实现方式，根据实际使用的IMU模块
 * 来决定，因此，如果需要替换模块，只需要重新实现头文件对应
 * 的源文件即可。
 */ 
#ifndef _IMU_ADAPTION_H
#define _IMU_ADAPTION_H

#include "system_queue_message.h"
#include "stdint.h"

#define SELF_CALLIBRATION_ENABLE	1
#define IMU_CALIBRATION_TIME    20000



typedef struct __IMU_Typedef{

	// 原始数据
	int16_t 	acc_raw[3];
	int16_t 	gyro_raw[3];
	int16_t 	temp_raw;

	// 方向转换后的原始数据
	int16_t 	acc_rot[3];
	int16_t		gyro_rot[3];

	int8_t 		direction[6];

	// 数据偏置
	float		acc_offset[3];
	float		gyro_offset[3];
	float		acc_ratio[3];
	
	// 真实数据
	float 		acc_rel[3];
	float 		gyro_rel[3];
	// 用于消息队列发送的数据
	sensor_imu_msg imu_msg;
	
#if  SELF_CALLIBRATION_ENABLE == 1
    float gyro_sum[3];
    uint16_t record_cnt;
#endif
	
	uint64_t 	record_time_us;
	uint64_t 	last_record_time_us;
	uint32_t	derta_record_time_us;
	uint16_t	update_freq_Hz;
}IMU_Typedef;


/**
 * @brief 初始化IMU设备
 * 
 * @return int8_t 0 成功 -1 失败
 */
int8_t IMU_init(IMU_Typedef *IMU_Handle);

void IMU_GetAccRaw(IMU_Typedef *IMU_Handle, int16_t *_acc_raw);

void IMU_GetGyroRaw(IMU_Typedef *IMU_Handle, int16_t *_gyro_raw);

void IMU_GetTempRaw(IMU_Typedef *IMU_Handle, int16_t *_temp_raw);

void IMU_GetAccRel(IMU_Typedef *IMU_Handle, float *_acc_rel);

void IMU_GetGyroRel(IMU_Typedef *IMU_Handle, float *_gyro_rel);

int8_t IMU_UpdateData(IMU_Typedef *IMU_Handle);



#endif /* _IMU_ADAPTION_H */

